import pandas as pd 
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns

import warnings
warnings.filterwarnings("ignore")

#加载数据
df = pd.read_csv('./scenic_data.csv')
#提取特征并标准化
features = df[['non_weekend_ratio','out_province_retio','elderly_retio']]
scaler  = StandardScaler()
scaled_features = scaler.fit_transform(features)
#使用k-means聚类
kmeans = KMeans(n_clusters=4,random_state=42)
df['cluster'] = kmeans.fit_predict(scaled_features)
print(df[['tourist_agency_name','cluster']])
#查看聚类中心（反标准化）
centers = scaler.inverse_transform(kmeans.cluster_centers_)
print(pd.DataFrame(centers,columns=['non_weekend_ratio','out_province_retio','elderly_retio']))
#保存结果
df.to_csv('clustered_agencies.csv',index=False)
#
centers_df= pd.DataFrame(centers,columns=features.columns)
centers_df['cluster'] = [f'Cluster {i}' for i in range(centers.shape[0])]
#将宽边转换为长表（适合Seaborn）
centers_long = centers_df.melt(id_vars='cluster',var_name='feature',value_name='value')
#绘制分组柱状图
colors=['#1f77b4','#ff7f0e','#2ca02c']
plt.figure(figsize=(10,6))
sns.barplot(x='feature',y = 'value',hue='cluster',data=centers_long,palette=colors)
plt.title('聚类中心特征对比')
plt.ylabel('比例')
plt.ylim(0,1)
plt.legend(title='簇 ',bbox_to_anchor=(1.05,1),loc='upper left')
#添加数值标签
for p in plt.gca().patches:
    height = p.get_height()
    plt.gca().text(p.get_x() + p.get_width() / 2,height + 0.02,f'{height: .2f}',ha='center')
plt.tight_layout()
plt.show()